package cn.tedu.account.tcc;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/*tcc模式的操作接口,添加@LocalTCC注解*/
@LocalTCC
public interface AccountTccAction {
    /*添加方法及参数的配置：
     *  1. @TwoPhaseBusinessAction()两阶的段业务操作，添加此注解的方法标记为第一个阶段操作方法
     *  2. 在注解中可以使用commitMethod = "方法名",rollbackMethod = "方法名"配置提交和回滚操作的方法
     *
     *  3. 参数：BusinessActionContext 业务操作上下文对象，每一个方法都要添加，因为后两个阶段我们无法传参，需要借用上下文对象
     *  4. 传入订单参数：这里为了避开seata的一个bug，不使用封装对象，而是将参数分开一个个单独传参
     *  5. 给指定的参数添加@BusinessActionContextParameter注解：
     *     @BusinessActionContextParameter 业务操作上下文对象，添加此注解可以将指定的参数放入上下文对象中
     *     @BusinessActionContextParameter(paramName = "productId")放入上下文对象时给参数重新命名
     * */
    @TwoPhaseBusinessAction(name = "AccountTccAction",commitMethod = "commit",rollbackMethod = "rollback")
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "userId") Long userId,
                    @BusinessActionContextParameter(paramName = "money") BigDecimal money);    //操作数据

    boolean commit(BusinessActionContext ctx);     //提交

    boolean rollback(BusinessActionContext ctx);   //回滚
}
